<?php
/**
库存管理
采购单入库
填写入库
领货单
调拨
报损

库存提醒

库存盘点

入库所需条件：目标仓库 入库来源 入库项目 入库项目数量 操作人员编号 入库日期 操作状态 备注
出库所需条件：目标仓库 出库目的 出库项目 出库项目数量 操作人员编号 出库日期 操作状态 备注
*/

class StockAction extends CommonAction {
	
	/**
	库存首页
	*/
	public function index(){
        //列表过滤器，生成查询Map对象
        $map = $this->_search();
        if (method_exists($this, '_filter')) {
            $this->_filter($map);
        }
        $model = M('Stock');
		$field='id,goodsid,product_code,product_name,store,stockin,stockout,sale,loss,reallocate,depot,return,real,status,`stockin` - `stockout` - `sale` - `loss` - `reallocate` - `depot` + `return` as `stock`';
		$this->_list($model, $map,'','',$field);
        $this->display();
	}
	/**
	查看产品详情
	*/
	public function view(){
		$this->redirect('Goods/edit',array('id'=>$_GET['id']),0,'');
	}
	
	/**
	采购单入库
	此处将现有的未入库的采购单转化为入库单
	*/
	public function purchase(){
		$purchaseId=$_REQUEST['id'];
		if(intval($purchaseId==0)){
			$this->error('缺少采购单id');
		}
		/**
		获取采购单项目信息
		*/
		$Purchase=M('Purchase');
		$vo=$Purchase->find($purchaseId);
		if($vo['market_check']==0||$vo['financial_check']==0){
			$this->error('采购单还未通过审核');
		}
		if($vo['status']=='finished'){
			$this->error('采购单已经完成入库了不要重复操作');
		}
		$items=json_to_array(json_decode($vo['items']));
		$this->assign('number',gen_report_number('ruku',$_POST['store']));
		$this->assign('vo',$vo);
		$this->assign('list',$items);
		$this->display();
	}
	
	/**
	普通入库
	*/
	public function stockin(){
		$this->assign('number',gen_report_number('ruku',$_POST['store']));
		$this->display();
	}
	/**
	出库 领货
	*/	
	public function stockout(){
		$this->assign('number',gen_report_number('chuku',$_POST['store']));
		$this->display();
	}
	
	/**
	调拨出库部分
	*/	
	public function reallocate(){
		$this->assign('number',gen_report_number('chuku',$_POST['store']));
		$this->display();
	}
	
	/**
	调拨入库部分
	*/
	public function reallocatein(){
		/**
		根据调拨单获取入库数据
		*/
		$id=$_REQUEST['id'];
		$Report=M('StockReport');
		$vo=$Report->find($id);
		$items=json_to_array(json_decode($vo['items']));
		$this->assign('number',gen_report_number('ruku',$_POST['store']));
		$this->assign('vo',$vo);
		$this->assign('items',$items);
		$this->display();
	}	
	
	/**
	采购退货
	这个先不做
	*/
	public function purchasedepot(){
		$this->assign('number',gen_report_number('tuihuo',$_POST['store']));
		$this->display();
	}
	
	/**
	入库退货
	*/	
	public function depot(){
		$this->assign('number',gen_report_number('tuihuo',$_POST['store']));
		$this->display();
	}
	
	/**
	报损
	*/
	public function reportloss(){
		$this->assign('number',gen_report_number('baosun',$_POST['store']));
		$this->display();
	}
	
	/**
	库存盘点 实际上就是显示现有所有库存 并有打印功能
	*/
	public function check(){
		$this->display();
	}
	
	
	/**
	库存提醒 实际上就是查询到达库存下限的库存产品
	*/
	public function stocklow(){
	
		/**
		查询达到库存下限的库存
		*/
		
		$this->display();
	}
	

	/**
	通用入库处理
	*/
	public function act_stockin(){
		/**
		判断信息完整性
		仓库ID  入库项目 入库日期 
		*/
 		if($_POST['store']==''){
			$this->error('请选择需要入库的仓库');
		} 
		if($_POST['date']==''){
			$this->error('请输入日期');
		}
		/**
		添加人员信息
		获取当前用户ID
		*/
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];
		
		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='supplier'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
			/*	dump($items);
 				die; */
		
		/**
		统一库存增加
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/
		$map['store']=array('eq',$_POST['store']);
		foreach($items as $vo){
			/**
			对于固定资产类的入库项目只需要记录到库存数据即可
			遇到之前有一台电脑入库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			
			if($vo['product_name']==''||intval($vo['number']==0)){
				continue;
			}
			
			/**
			对于需要录入名称的直接当做新的库存项目处理
			*/
			if($vo['addname']==1){	
				$vo['goodsid']=0;
				$vo['store']=$_POST['store'];
				$vo['stockin']=$vo['number'];
				$vo['status']=1;
				$r=$Stock->add($vo);
				if($r){//操作成功
					$result[]=array(0=>$r,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			}
			else{
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				$r=$Stock->where($map)->setInc('stockin',$vo['number']);
				/**
				判断$r的返回情况确定是否增加成功
				没有成功则在库存中新增库存项目
				*/
				
				if($r==0||$r==false){
					/**
					获取产品id
					*/
					$Goods=M('Goods');
					$vo['goodsid']=$Goods->where("product_code=".$vo['product_code'])->getField('id');
					$vo['store']=$_POST['store'];
					$vo['stockin']=$vo['number'];
					$vo['status']=1;
					$r=$Stock->add($vo);
				}
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			}	
		}

		/**
		库存处理完成 记录入库单
		*/
		if($_POST['type']=='caigou'){
			$Purchase=M('Purchase');
			$Purchase->setField('status','finished')->where("id=".$_POST['Purchaseid']);
		}
		
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('ruku',$_POST['store']);
		$Report=M('StockReport');
		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功入库');
	}
	
	/**
	通用出库处理
	*/
	public function act_stockout(){

		/**
		判断信息完整性
		仓库ID 出库项目 出库日期 
		*/
		
		if($_POST['store']==''){
			$this->error('请选择需要出库的仓库');
		}

		/**
		添加人员信息
		获取当前用户ID
		*/
		
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];

		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='number'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
		
		/**
		统一库存增加
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/
		$map['store']=array('eq',$_POST['store']);
		foreach($items as $vo){
			/**
			对于固定资产类的出库项目只需要记录到库存数据即可
			遇到之前有一台电脑出库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			
			if($vo['product_name']==''||intval($vo['number']==0)){
				continue;
			}
			
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				$r=$Stock->where($map)->setDec('stockout',$vo['number']);
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			
		}
		//dump($result);
		/**
		库存处理完成 记录入库单
		*/
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('chuku',$_POST['store']);
		$Report=M('StockReport');
		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功出库');
		
	}
	
	/**
	调拨单出库
	库存先执行出库
	*/
	public function act_reallocate(){
		/**
		判断信息完整性
		仓库ID 出库项目 出库日期 
		*/
		
		if($_POST['store']==''){
			$this->error('请选择需要出库的仓库');
		}
		
		if($_POST['tostore']==''){
			$this->error('请选择需要出库的仓库');
		}
		
		if($_POST['tostore']==$_POST['store']){
			$this->error('出库仓库和目标仓库不能是同一个');
		}		
		/**
		添加人员信息
		获取当前用户ID
		*/
		
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];

		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='supplier'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
		
		/**
		统一库存调拨出库
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/
		$map['store']=array('eq',$_POST['store']);

		foreach($items as $vo){
			/**
			对于固定资产类的出库项目只需要记录到库存数据即可
			遇到之前有一台电脑出库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			
			if(empty($vo['product_name'])||intval($vo['number'])==0){
				continue;
			}
			
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				$r=$Stock->where($map)->setDec('stockout',$vo['number']);
				
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			
		}
		
		/**
		库存处理完成 记录调拨单
		*/
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('reallocate',$_POST['store']);
		$Report=M('StockReport');
		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功生成调拨');		
	}
	
	/**
	调拨单入库
	库存先执行入库
	*/	
	public function act_reallocatein(){
		/**
		判断信息完整性
		仓库ID  入库项目 入库日期 
		*/
		if($_POST['store']==''){
			$this->error('请选择需要入库的仓库');
		}
		
		if($_POST['date']==''){
			$this->error('请输入日期');
		}
		
		if($_POST['reportid']==''){
			$this->error('信息不完整');
		}
		//判断调拨入库单能否继续使用
		$Report=M('StockReport');
		$status=$Report->where("id=".$_POST['reportid'])->getField('status');
		if($status=='finished'){
			$this->assign('jumpUrl',"/Admin/Stock/index");
			$this->error('请不要重复提交');
		}
		/**
		添加人员信息
		获取当前用户ID
		*/
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];
		
		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='number'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
				//dump($items);
		
		/**
		统一库存增加
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/

		$map['store']=array('eq',$_POST['store']);
		foreach($items as $vo){
			/**
			对于固定资产类的入库项目只需要记录到库存数据即可
			遇到之前有一台电脑入库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			if($vo['product_name']==''||intval($vo['number']==0)){
				continue;
			}
			
			/**
			对于需要录入名称的直接当做新的库存项目处理
			*/
			if($vo['addname']==1){	
				$vo['goodsid']=0;
				$vo['store']=$_POST['store'];
				$vo['stockin']=$vo['number'];
				$vo['status']=1;
				$r=$Stock->add($vo);
				if($r){//操作成功
					$result[]=array(0=>$r,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			}
			else{
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				/**
				此处应该分为两种情况
				目标仓库已经有这个库存项目
				目标仓库没有这个库存项目需要新增库存条目
				*/
				
				$r=$Stock->where($map)->setInc('stockin',$vo['number']);
				/**
				$r返回值为false 认为目标仓库现在没有这个库存
				执行新增库存条目
				调拨的入库任然当做入库操作不做调拨字段
				*/
				$Goods=M('Goods');
				if($r==false){
					$goodsinfo=$Goods->where("product_code='".$vo['product_code']."'")->limit('1')->getField('`id` as `goodsid`,`product_code`,`product_name`,`unit`');
					/**
					此处返回的$goodsinfo不是一维数组
					*/
					$goodsinfo=array_pop($goodsinfo);
					$goodsinfo['stockin']=$vo['number'];
					$goodsinfo['store']=$_POST['store'];
					$r=$Stock->add($goodsinfo);
				}
				
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
				
			}
			
		}
		/**
		更新调拨出库单记录状态避免重复操作
		*/	
		$Report->where("id=".$_POST['reportid'])->setField('status','finished');
		
		/**
		库存处理完成 记录入库单
		*/
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('reallocatein',$_POST['store']);

		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功入库');		
	}
	
	public function act_depot(){
		/**
		判断信息完整性
		仓库ID 出库项目 出库日期 
		*/
		
		if($_POST['store']==''){
			$this->error('请选择需要退货的物资所在的仓库');
		}
				
		/**
		添加人员信息
		获取当前用户ID
		*/
		
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];

		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='number'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
		
		/**
		统一库存退货处理
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/
		$map['store']=array('eq',$_POST['store']);

		foreach($items as $vo){
			/**
			对于固定资产类的出库项目只需要记录到库存数据即可
			遇到之前有一台电脑出库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			
			if(empty($vo['product_name'])||intval($vo['number'])==0){
				continue;
			}
			
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				$r=$Stock->where($map)->setInc('depot',$vo['number']);
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			
		}
		
		/**
		库存处理完成 记录退货单
		*/
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('reallocate',$_POST['store']);
		$Report=M('StockReport');
		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功生成退货');		
		
	}
	
	public function act_reportloss(){
		/**
		判断信息完整性
		仓库ID 出库项目 出库日期 
		*/
		
		if($_POST['store']==''){
			$this->error('请选择需要报损的仓库');
		}
		if($_POST['title']==''){
			$_POST['title']=C('companyname')."报损单".date('Y-m-d H:i:s');
		}
		/**
		添加人员信息
		获取当前用户ID
		*/
		
		$_POST['operator']=$_SESSION['authId'];
		$_POST['username']=$_SESSION['loginUserName'];

		/**
		处理传入的入库项目明细转化input数组为方便操作的2维数组
		*/
		$tt=$_POST['items'];
		$c=0;
		
		$items=array();
		foreach($tt as $val){
				$r=array_keys($val);//获取键名数组
				if($r[0]=='number'){
					$items[$c][$r[0]]=$val[$r[0]];
					$c++;
				}else{
					$items[$c][$r[0]]=$val[$r[0]];
				}
		}
		
		/**
		统一库存报损处理
		*/				
		$Stock=M('Stock');//需要确定使用D还是M方法
		$result=array();//记录库存处理状态
		/**
		默认查询条件
		*/
		$map['store']=array('eq',$_POST['store']);

		foreach($items as $vo){
			/**
			对于固定资产类的出库项目只需要记录到库存数据即可
			遇到之前有一台电脑出库 后续需要在入库一台电脑是增加数量
			目前按照新增库存记录处理
			或者可以考虑根据品名确定是否存在?
			*/
			
			if(empty($vo['product_name'])||intval($vo['number'])==0){
				continue;
			}
			
				/**
				以产品编号为准查询库存项目
				<--然后以产品名称查询库存项目!-->
				*/
				$map['product_code']=array('eq',$vo['product_code']);
				$r=$Stock->where($map)->setInc('loss',$vo['number']);
				if($r){//操作成功
					$result[]=array(0=>$vo,1=>true);
				}else{
					$result[]=array(0=>$vo,1=>false);
				}
			
		}
		
		/**
		库存处理完成 记录报损单
		*/
		$_POST['items']=json_encode($items);
		$_POST['date']=strtotime($_POST['date']);
		//$_POST['number']=gen_report_number('reallocate',$_POST['store']);
		$Report=M('StockReport');
		$Report->create();
		$Report->add();
		$this->assign('jumpUrl',"/Admin/Stock/index");
		$this->success('成功报损');			
	}
	
	
	/**
	导出当前库存到csv中
	*/
	public function export(){
	
	}
	

}